#include"Info.h"
#include"TeleInfo.h"

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

struct TeleInfo
{
    ElementType *a;         //数组  指针
    int size;               //元素的个数
    int capacity;          //数组的容量
};



TI* InitTi(int capacity)
{
    TI*ti = (TI*)malloc(sizeof(TI));
    if(ti == NULL)
    {printf("InitDArray ti malloc 申请内存失败!\n");}
    ti->size = 0; //赋值的时候还没有放东西，所以起始一定是0
    ti->capacity = capacity; //容量是我们自己决定的
    
    ti->a = (ElementType*)malloc(sizeof(ElementType) * capacity);
                                    //申请一块堆上空间用来存放数组a
    
    if(ti->a == NULL)
    {
        printf("ti->a malloc 申请内存失败!\n");
        free(ti);//申请失败记得释放内存
        return NULL;//还得返回空指针结束
    }
    return ti; //成功的申请了一块内存放 TI* 的指针 ti 的 数据
}


void InsertTail(TI*ti,ElementType element)
{
    if(ti->size >= ti->capacity)
    {
        ti->capacity *= 2;
        ElementType* newTpr = realloc(ti->a,sizeof(ElementType) * ti->capacity);
        if(newTpr == NULL)
        {
            printf("扩容数组失败，不能进行插入！\n");
            ti->capacity /=2;
            return;

        }
         ti->a = newTpr;
    }
    ti->a[ti->size++] = element; 
}

void PrintTi(TI *ti, void (*print)(ElementType))
{
    for (int i = 0; i < ti->size ; i++)
    {
        print(ti->a[i]);
    }
    printf("\n");
}





IN* FindByElement(TI*ti,ElementType element,bool (*IsEqual)(void* ,void* ))  //按照 数值 寻找数组中的 某个 数
{
    for (int i = 0; i < ti->size; i++)
    {
        if(IsEqual(ti->a[i],element))
        {return ti->a[i];}
    }
    return NULL;
}




void RemoveByIndex(TI*ti,int index)
{
    if(index < 0 || index > ti->size)
    {
        printf("非法位置，无法删除\n");
        return;
    }

    for(int i = index;i < ti->size;i++)
    {
        ti->a[i]=ti->a[i+1];

    }
    ti->size--;
}



void RemoveByElement(TI*ti,ElementType element,bool (*IsEqual)(void*,void*))
{
    for(int i=0;i<ti->size;i++)
    {   
        if(IsEqual(ti->a[i],element))
        {
        RemoveByIndex(ti,i);
        i--; //判断是否有几个相同的 值 连续放
        }
    }
}



void FastSort(ElementType *a,int start,int end, bool (*IsEuqal)(ElementType,ElementType))
{
    if(start >= end)
        return;
    
    int left = start;
    int right = end;
    
    ElementType temp = a[left];//将最左边的值定为基准值
   
    while(left < right)
    {
        //右边往左动，找比基准值小的数
        while(IsEuqal( a[right] , temp) && left < right)
            right--;
        
        if(left < right)
        {
            a[left++] = a[right];//把右边的比基准值小的数扔到左边的指针
        }
        
        //左边往右边动，找比基准值大的数
        while(IsEuqal(temp,a[left]) && left < right)
            left++;
        if(left < right)
        {
            a[right--] = a[left];//把左边比基准值大的数扔到右边
        }
    }
    
    a[left] = temp;

    //递归
    FastSort(a,start,left - 1,IsEuqal);
    FastSort(a,right+1,end,IsEuqal);

}



void Sort(TI *ti,bool (*IsEuqal)(ElementType,ElementType))
{
    FastSort(ti->a,0,ti->size-1,IsEuqal);
}



















void FreeTI(TI *ti,void (*Free)(ElementType))
{
    if(Free)
    {
    for(int i=0;i<ti->size;i++)
    {Free(ti->a[i]);}
    }
    free(ti->a);
    free(ti);
}
